package com.tao.service.impl.Mq;

import com.rabbitmq.client.Channel;
import com.tao.pojo.Submittable;
import com.tao.service.SubmittableService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Date;

/**
 * @Author: alubus
 * @Date: 2021/12/3 10:06
 * @Package: com.tao.service.impl.Mq
 */
@Component
public class SubmitReceiveMqService {
    private Logger logger = LoggerFactory.getLogger(getClass());




    @Autowired
    SubmittableService submittableService;

    /**
     * 监听转发队列  走逻辑判断，尚未支付且超过过期时间的订单号设置为失效订单
     * @param message 信息包装类
     * @param channel 通道
     */
//    @RabbitListener(queues = {"ORDER_REDIRECT_QUEUE"})
//    public void redirect(Message message, Channel channel) throws IOException {
//        // 从队列中取出订单号
//        byte[] body = message.getBody();
//        String orderNo = new String(body,"UTF-8");
//        System.out.println(new Date() +  "消费消息，订单号为" + orderNo);
//        // 确认消息有没有被收到,false表示手动确认  在处理完消息时，返回应答状态
//        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
//
////        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//    }


    /*
    倒计时完了才收得到
    * 死信队列，在确认前 做一个判断，
    *
    * */
    @RabbitListener(queues = {"Submit_Queue"})
    public void Submit_Queue(Message message, Channel channel) throws IOException {
        try {
            // 从队列中取出订单号

            byte[] body = message.getBody();
            String orderNo = new String(body,"UTF-8");
                        logger.warn("======ORDERNO:"+orderNo);
//            logger.warn("Message:" + message.toString());
            Long sid= Long.valueOf(orderNo);

//            查询订单状态  0 未成功，1成功 ，2 过期
            Submittable submittable = submittableService.getById(sid);
            int status = submittable.getStatus();

            if (status == 0 || status==2){
                submittable.setStatus(2);
                submittableService.updateById(submittable);
                /*
                * 成功接收
                * 因为时间已到还是 未提交0 的状态
                *
                 */
                logger.warn("*********未提交 ---> 已过期");

                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            }

            if (status == 1){
                logger.warn("*****重复  提交 ");

                /*
                *status =1  表示已经处理了，不用接收
                */
                channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒绝消息
            }


//                throw new  IOException("=======is guoqile =======");

            // 确认消息有没有被收到,false表示手动确认  在处理完消息时，返回应答状态
        } catch (IOException e) {
            logger.error(e.getMessage()+",消息即将再次返回队列处理...");
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//            channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒绝消息

        }
    }
}
